//
//  WBNetworkManager.swift
//  Weibo
//
//  Created by apple on 2016/12/4.
//  Copyright © 2016年 yanjun. All rights reserved.
//

import UIKit
import AFNetworking

// swift 的枚举支持任意数据类型
enum WBHTTPMethod{
    
    case GET
    case POST
}

class WBNetworkManager: AFHTTPSessionManager {

    // 静态区/常量/闭包/
    // 在第一次访问时执行闭包，并且将结果保存在 shared 常量中
    static let shared = { () -> WBNetworkManager in 
        
        // 实例化对象
        let instance = WBNetworkManager()
    
        // 设置响应反序列化的数据支持类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        return instance
    }
    
    // 用户账号的懒加载
    lazy var userAccount = WBUserAccount()
    
    // 用户登录标记[计算型属性]
    var userLogon: Bool {
        return userAccount.access_token != nil
    }
    
    
    // 负责拼接 token 的网络请求
    func tokenRequest(method:WBHTTPMethod = .GET, URLString: String,parameters: [String: Any]?, completion: @escaping ( _ json: AnyObject?, _ isSuccess: Bool)->() ) {
        
        // 处理 token 字典
        // 程序执行过程中，一般 token 不会为 nil
        guard let token = userAccount.access_token else {
            
            // 发送通知，提示用户登录(本方法不知道被谁调用，谁接收到通知谁处理)
            print("没有 token需要登录")
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: nil)
            
            
            completion(nil, false)
            return
        }
        
        
        // 1> 判断参数字典是否存在，如果为 nil ，应该新建一个字典
        var parameters = parameters
        if parameters == nil {
            parameters = [String: AnyObject]()
        }
        
        // 2> 设置参数字典
        parameters!["access_token"] = token
        
        
        // 调用request
        request(URLString: URLString, parameters: parameters!, completion: completion)
    }
    
    func request(method:WBHTTPMethod = .GET, URLString: String,parameters: [String: Any], completion: @escaping ( _ json: AnyObject?, _ isSuccess: Bool)->() ) {
        
        // 成功回调
        let success = { (task: URLSessionDataTask, json:Any?) -> () in
            
            completion(json as AnyObject?,true)
            
        }
        
        // 失败回调
        let failure = { (task: URLSessionDataTask?,error: Error) -> () in
            
            // 针对 403 处理 token 过期
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                
                // FIXME: 发送通知，提示用户登录(本方法不知道被谁调用，谁接收到通知谁处理)
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: "bad token")
            }
            
            // error 通常比较吓人，
            print("网络请求错误\(error)")
            completion(nil, false)
        }
        
        if method == .GET {
            
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }else{
            
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
        
        
    }
    
    
}
